<!DOCTYPE html>
<html lang="en">
<script type="text/javascript" src="algrithem.js"></script>
<link rel="stylesheet" href="index.css">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>

</head>

<body>
  <div class="answer" onclick="func1()">
    <div class="label">第1题</div>

    <pre class="pre">
      // 1. 使用函数方法书写一段程序， 判断一个数是不是完美数。
      // 如果一个数恰好等于它的因数之和， 则称该数为“ 完美数”。
      // 例如： 第1个完全数是6， 它有因数1、 2、 3、 6， 除去它本身6外， 其余3个数相加， 1 + 2 + 3 = 6。
      //   计算因数通用算法
      function calYinshu(num){
          var list = [];
          list.push(1);
          var stopNum = Math.sqrt(num);
          for(i = 2; i < stopNum; i++){
              if(num % i == 0){
                  list.push(i);
                  list.push(num / i);
              }
          }
          return list;
      }
      // 数组求和
      function sum(list){
          if(undefined == list)
              return 0;
          var sum = 0;
          for(i= 0; i < list.length; i++){
              sum += list[i];
          }
          return sum;
      }
      
      //     1. 使用函数方法书写一段程序，判断一个数是不是完美数。
      // 如果一个数恰好等于它的因数之和，则称该数为“完美数”。
      // 例如：第1个完全数是6，它有因数1、2、3、6，除去它本身6外，其余3个数相加，1+2+3=6。
      function func1() {
          var num = parseInt(prompt('请输入一个要进行判断的正整数'));
          if (num % 1 === 0 && num > 1) {
              if(sum(calYinshu(num)) == num){
                  alert(num + '是完美数');
              }else{
                  alert(num + '不是完美数');
              }
          }
          else {
          //num不是大于1的正整数抛出错误
          alert('您输入有误，请重新输入');
        }
      }
    </pre>
  </div>
  <div onclick="func2()" class="answer">
    <div class="label">第2题</div>
    <pre>
// 盈数是一种特殊的自然数，除去它本身以外的一切正约数的和大于它本身。与完美数类似。
// 第2题：输出1~100的所有盈数
function func2() {
    var list = [];
    for(i=1;i<=100;i++){
        if(sum(calYinshu(i)) > i){
            list.push(i);
        }
    }
    alert("1~100的所有盈数"+ list);
}
    </pre>
  </div>
  <div onclick="func3()" class="answer">
    <div class="label">第3题</div>
    <pre>
      // 3. 用户输入一个整数n：求1!+2!+3!+4!+…… +n!的和，叹号表示阶乘， 如4! = 1 * 2 * 3 * 4 
      function func3() {
          var num = parseInt(prompt('请输入要计算的正整数'));
          var cache = [];
          cache[0] = 1;
          for(var i = 1; i < num; i++){
              cache[i] = cache[i-1]* i;
          }
          alert("计算结果为："+ sum(cache));
          // return sum(cache);
      }
    </pre>
  </div>
  <div onclick="func4()" class="answer">
    <div class="label">第4题</div>
    <pre>
//4. 求一个三位数，叫做“喇叭花数”，该三位数等与其每位数字的阶乘之和。输出100~999的所有喇叭花数。
function func4() {
    var num = 999;
    var cache = [];
    cache[0] = 1;
    var i = 1
    for(; i <= num; i++){
        cache[i] = cache[i-1]* i;
    }
    cache[0]= 0;
    var res =[];
    var loop = 100;
    for(;loop < 1000; loop++){
        var first = loop % 10;
        var second = (loop/10) %10;
        var third = (loop/100) %10;
        var sum = cache[first] + cache[second] + cache[third];
        if(loop == sum)
            res.push[loop];
    }
    alert("100~999为："+ res);
    // return sum(cache);
}
    </pre>
  </div>
  <div onclick="func5()" class="answer">
    <div class="label">第5题</div>
    <pre>
      // 5. 如果整数A 的全部约数（包括1，不包括A 本身）之和等于B，且整数B 的全部约数
// （包括1，不包括B 本身）之和等于A，则称整数A和B是一对亲密数。
// 求2000 以内的全部亲密数。
function func5() {
    var nums = 2000;
    var list = [];
    var i = 1;
    for(;i<=nums;i++){
        list.push(sum(calYinshu(i)));
    }
    var i = 1;
    var counts=0;
    var res=[];
    for(;i<=nums;i++){
        var j=i+1;
        var pairs=[];
        pairs.push[i];
        for(;j<=nums;j++){
            if(list[i] == list[j]){
                pairs.push[j];
            }
        }
        if(pairs.length > 1){
            res.push(pairs);
        }
    }
    alert("1~2000的所有亲密数:"+ res);
}
    </pre>
  </div>
  <div onclick="func6()" class="answer">
    <div class="label">第6题</div>
    <pre>
      // 6. 验证哥德巴赫猜想。一个偶数可以拆分成两个质数之和。
function calZhishu(num){
    var res = new Set();
    for(var index = 2; index <= num; index++){
        var stopNum = parseInt(Math.sqrt(index));
        for(i = 2; i <= stopNum; i++){
            if(num % i == 0){
                continue;
            }else{
                if(i == stopNum){
                    res.add(index);
                }
            }
        }
    }
    return res;
}
function func6(){
    var num = parseInt(prompt('请输入要验证的正偶数'))
    var zhishus = calZhishu(num);
    while(num % 2!= 0){
        num = parseInt(prompt('请输入要验证的正偶数'))
    }

    for(var i=2; i < num/2;i++){
        if(zhishus.has(num-i)){
            alert(num+"可以拆分成两个质数之和。");
            return;
        }
    }
    alert(num+"不可以拆分成两个质数之和。");
}
    </pre>
  </div>
  <div onclick="func7()" class="answer">
    <div class="label">第7题</div>
    <pre>
// 7. 编写函数rev(char) 实现将字符串char倒置
// 比如rev("spring") 返回"gnirps"
function func7(){
    var str = new String(prompt('请输入要倒转的字符串'));
    var reverseStr = new String();
    // return 
    for (let index = str.length-1; index >= 0; index--) {
        reverseStr.concat(str.charAt(index))
        
    }
    alert("倒转后的字符串为：" + reverseStr);
}
    </pre>
  </div>
  <div onclick="func8()" class="answer">
    <div class="label">第8题</div>
    <pre>
// 8. 将字符串"i come from beijing"倒置，即控制台输出"beijing from come i"
// 语句直接写在程序中，不需要用户输入
function func8(){
    var str = "i come from beijing";
    var words = str.split(" ");
    var reverseWords = [];
    var length = words.length-1;
    for (let index = 0; index <= length; index++) {
        reverseWords[index] = words[length-index];
        
    }
    var reverseStr = words.join(" ");
    console.log(reverseStr);
    alert("倒转后的语句为：" + reverseStr);
}
    </pre>
  </div>
  <div onclick="func9()" class="answer">
    <div class="label">第9题</div>
    <pre>
// 9. 编写函数rightchange(char,n) 实现字符串char循环右移n位。
// 比如rightchange("abcdefg",2) 返回"fgabcde"
function func9(){
  var str = new String(prompt('请输入右移的字符串'));
  var n = parseInt(prompt('请输入要右移的位数'));
  var shiftStr = new String();
  var length = str.length;
  if(n>length)
      n = n % length; 
  console.log(str);
  for (let index = str.length-n; index < str.length; index++) {
      console.log(str.charAt(index));
      shiftStr = shiftStr + (str.charAt(index));
      console.log(shiftStr);
  }
  for (let index = 0; index < str.length-n; index++) {
      console.log(str.charAt(index));
      shiftStr = shiftStr + (str.charAt(index));
      console.log(shiftStr);
  }
  alert("倒转后的字符串为：" + shiftStr);
}
    </pre>
  </div>
  <div onclick="func10()" class="answer">
    <div class="label">第10题</div>
    <pre>
// 10. 编写函数maxr(char) 返回字符串char中最长的连续重复字母
// 比如maxr("mmmiijjjjkkkkkkssptr") 返回"kkkkkk"
function func10(){
    var str = new String(prompt('请输入右移的字符串'));
    var i=0,j=1,maxLength = 0,maxLeft = 0,maxStr ='';
    while(i<str.length){
        if(str[i] == str[j]){
            j++;
        }else{
            if(j-i> maxLength){
                maxLeft = i;
                maxLength = j-1;
                maxStr = str.charAt(i);
            }        
            i=j;
            j++;
        }
    }
    maxStr = str.substr(maxLeft, maxLength);
    alert('字符串'+str+'中最长的连续重复字母为：'+maxStr)
}
    </pre>
  </div>
  <div onclick="func11()" class="answer">
    <div class="label">第11题</div>
    <pre>
      // 10. 编写函数maxr(char) 返回字符串char中最长的连续重复字母
      // 比如maxr("mmmiijjjjkkkkkkssptr") 返回"kkkkkk"
      function func10(){
          let grades = [100,90,80,85,67,34];
          let nums = grades.length;
          let counts = 0;
          let sum = 0;
          let avg = 0;
          for (let index = 0; index < nums; index++) {
              sum += grades[index];
          }
          avg = sum /nums;
          for (let index = 0; index < nums; index++) {
              if(grades[i] >= avg){
                  counts++;
              }
          }
          alert("大于等于平均成绩的人数为：" + counts);
      }
    </pre>
  </div>
  <div onclick="func12()" class="answer">
    <div class="label">第12题</div>
    <pre>
// 12.  将"i love javascript very much"的每个单词的第一个字母，变为大写。
function func12(){
    let str = "i love javascript very much";
    let words = str.split(" ");
    for (let index = 0; index < words.length; index++) {
        words[index] = words[index].replace(words[index][0],words[index][0].toUpperCase);
    }
    let strUpper = words.join(" ");
    alert("转换后的字符串为：" + strUpper);
}
    </pre>
  </div>
  <div onclick="func13()" class="answer">
    <div class="label">第13题</div>
    <pre>
      function func13(){
        let grades = [100,90,80,85,67,34];
        let max = Number.MIN_SAFE_INTEGER,min = Number.MAX_SAFE_INTEGER;
        let maxIndex = -1, minIndex = -1;
    
        for (let index = 0; index < grades.length; index++) {
            const element = array[index];
            if(element > max){
                max = element;
                maxIndex = index;
            }
            if(element < min){
                min = element;
                minIndex = index;
            }
        }
        alert('数组最大值是' + max + '，在数组下标为' + maxIndex + '的位置');
        alert('数组最小值是' + min + '，在数组下标为' + minIndex + '的位置');
    }
    </pre>
  </div>

  <div onclick="func14()" class="answer">
    <div class="label">第14题</div>
    <pre>
// 14.  将数组用 | 或其他符号连接成一个字符串。
function func14(){
    let str = "i love javascript very much";
    let words = str.split(" ");
    let strUpper = words.join("|");
    alert("转换后的字符串为：" + strUpper);
}
    </pre>
  </div>

  <div onclick="func15()" class="answer">
    <div class="label">第15题</div>
    <pre>
// 15.  将数组中值为 0 的项去掉，将不为 0 的值存入一个新的数组，生成新的数组。
function func15(){
    let array = [100,0,80,85,67,0,34];
    let res = [];
    for (let index = 0; index < array.length; index++) {
        const element = array[index];
        if(element == 0){
            continue;
        }
        res.push(element);
    }
    alert("去除0之后的数组为：" + res);
}
    </pre>
  </div>

  <div onclick="func16()" class="answer">
    <div class="label">第16题</div>
    <pre>
      // 16.  数组去重；    [1,1,1,2,2,3,4,5,6,3,4,2,4,1,] ---> [1,2,3,4,5,6]
      function func16(){
          let array = [1,1,1,2,2,3,4,5,6,3,4,2,4,1];
          let res = [];
          let set = new Set();
          for (let index = 0; index < array.length; index++) {
              const element = array[index];
              if(set.has(element)){
                  continue;
              }else{
                  set.add(element);
                  res.push(element);
              }
          }
          alert("去重之后的数组为：" + res);
      }
    </pre>
  </div>

  <div onclick="func17()" class="answer">
    <div class="label">第17题</div>
    <pre>
      // 17.  数组排序；    [3,4,1,2,6,5] ---> [1,2,3,4,5,6]
      function func17(){
          let array = [3,4,1,2,6,5];
          
          for (let i = array.length -1; i >= 0; i--) {
              let max = array[i],maxIndex = i;
              array[i];
              for (let j = 0; j < i; j++) {
                  if(array[j] > array[i]){
                      maxIndex = j;
                      max = array[j];
                  }
              }
              let tmp = array[i];
              array[i] = array[maxIndex];
              array[maxIndex] = tmp;
          }
          alert("排序之后的数组为：" + array);
      }
    </pre>
  </div>

  <div onclick="func18()" class="answer">
    <div class="label">第18题</div>
    <pre>
// 18.  数组转对象；
// ['a','a','a','b','b','c','c','c','c','d','d','d','d'] ---> {a: 3,b: 2,c: 4,d: 4}
function func18(){
    let array = ['a','a','a','b','b','c','c','c','c','d','d','d','d'];
    let count = {};
    for (let index = 0; index < array.length; index++) {
        const element = array[index];
        if(count[element]){
            count[element] = count[element] + 1;
        }else{
            count[element] = 1;
        }
    }
    alert("转换之后的对象为：" + count);
    </pre>
  </div>

  <div onclick="func19()" class="answer">
    <div class="label">第19题</div>
    <pre>
// 19.  使用js将99乘法表输出在控制台
function func19(){
    let array1 = [1,2,3,4,5,6,7,8,9];
    let array2 = [1,2,3,4,5,6,7,8,9];
    for (let i = 1; i < 10; i++) {
        for (let j = 1; j < 10; j++) {
            console.log(array1[i] + ' * ' + array2[j] + ' = ' + array1[i] * array1[j])
        }
    }
}
    </pre>
  </div>

  <div onclick="func20()" class="answer">
    <div class="label">第20题</div>
    <pre>
// 20. 买卖股票的最佳时机；给定一个数组，它的第i个元素是一支给定股票第i天的价格。如果你最多只允许完成一笔交易（即买入和卖出一支股票一次）设计一个算法来计算你所能获取的最大利润。
// 注意：你不能再买入股票前卖出股票
// 示例：
// 输入：[7, 1, 5, 3, 6, 4]
// 输出：5
// 解释：在第2天（当天股票价格等于1）的时候买入，在第五天（当天股票价格等于6）的时候卖出，最大利润为 6 - 1 = 5。
// 注意：利润不能使7 - 1 = 6，因为第二天的价格为1，第一天的价格为7，你是不可能在第二天买入股票然后等到第一天卖出的
function func20(){
    let array = [7, 1, 5, 3, 6, 4];
    let maxProfit = 0, buyDay = 0, saleDay = 1;
    for (let i = 0; i < array.length; i++) {
        const element = array[i];
        for (let j = 1; j < array.length; j++) {
            if(array[j] - array[i] > maxProfit){
                buyDay = i;
                saleDay = j;
                maxProfit = array[saleDay] - array[buyDay];
            }
        }
    }
    alert("在第 " + buyDay + "天买入,在第 " + saleDay + "天卖出收益最大为:"+ maxProfit)
}
    </pre>
  </div>
  
</body>

</html>